package middleware.p2p;

import java.util.LinkedList;

import org.apache.log4j.Logger;

/**
 *	Classe implementante una WorkerNetwork.
 *	Una WorkerNetwork è un insieme qualsiasi di Worker. Questa classe viene utilizzata all'interno delle Activity
 *	per definire l'insieme di Worker sui quali eseguire i Task del Workflow.
 *	@see Address
 */
public class WorkerNetwork {
	/**
	 * 	Lista contenente gli indirizzi dei Worker
	 */
    private LinkedList<Address> workers;
    /**
     * 	Costruttore di default della Classe.
     * 	Il costruttore si occupa di inizializzare la lista interna.
     */
    public WorkerNetwork(){
        workers = new LinkedList<Address>();
    }
    /**
     * 	Metodo per ottenere un array contenente tutti i Worker della WorkerNetwork
     * 	@return	Array contenente tutti gli elementi della WorkerNetwork
     */
    public Address[] getWorkers() {
        return workers.toArray(new Address[this.workers.size()]);
    }
    /**
     * 	Metodo per aggiungere un array di Worker alla WorkerNetwork
     * 	@param	wk	Array contenente gli Worker da aggiungere.
     */
    public void setWorkers(Address[] wk) {
        this.workers.clear();
        for(Address adrs : wk) {
            addWorker(adrs);
        }
    }
    /**
     * 	Metodo per aggiungere un Worker alla WorkerNetwork
     * 	@param	wk	Indirizzo del Worker da aggiungere.
     * 	@return	Ritorna l'indice del worker aggiunto.
     */
    public int addWorker(Address wk){
        this.workers.add(wk);
        return (this.workers.size()-1);
    }
    /**
     * 	Metodo per ottenere l'indirizzo del Worker con uno specificato indice.
     * 	@param	index	Indice del Worker di cui si vuole conoscere l'indirizzo.
     * 	@return	L'indirizzo del Worker desiderato oppure null.
     */
    public Address getWorker(int index){
    	try {
    		Address tAddr=workers.get(index);
    		return tAddr;
    	} catch (IndexOutOfBoundsException ioobe) {
    		ioobe.printStackTrace();
    		Logger.getLogger(this.getClass()).error(ioobe,ioobe);
    		return null;
    	}
    }
}
